﻿Namespace Logging

    ''' <summary>
    ''' ログ出力レベルを設定する列挙。<br/>
    ''' Sonodar.Common.Logging.Logger#Levelに設定する。
    ''' </summary>
    Public Enum LogLevel
        ''' <summary>
        ''' 致命的なエラー
        ''' </summary>
        FATAL = 0
        ''' <summary>
        ''' 復旧可能なエラー
        ''' </summary>
        ERR = 1
        ''' <summary>
        ''' 警告
        ''' </summary>
        WARN = 2
        ''' <summary>
        ''' 情報
        ''' </summary>
        INFO = 3
        ''' <summary>
        ''' デバッグまたはトレース
        ''' </summary>
        DEBUG = 4
    End Enum

    ''' <summary>
    ''' アプリケーションログ出力を行うためのクラス。<br/>
    ''' My.Application.Logの単純なラッパークラスであるため、ログの設定(出力ディレクトリ、ファイル名などの設定)は<br/>
    ''' アプリケーション構成ファイル({appName}.exe.config)で行う。
    ''' </summary>
    ''' <version>1.0 [sonodar] 2011/11/04 新規作成</version>
    Public Class Logger

        ''' <summary>
        ''' ログ出力レベル
        ''' </summary>
        Public Shared Level As LogLevel = LogLevel.ERR

#Region "PrivateなMy.Application.LogのWrapperメソッド"

        Private Shared Sub Log(ByVal message As String, ByVal severity As TraceEventType)
            My.Application.Log.WriteEntry(message, severity)
        End Sub

        Private Shared Sub Log(ByVal ex As Exception, ByVal severity As TraceEventType)
            My.Application.Log.WriteException(ex, severity, String.Empty)
        End Sub

        Private Shared Sub Log(ByVal message As String, ByVal ex As Exception, ByVal severity As TraceEventType)
            My.Application.Log.WriteException(ex, severity, message)
        End Sub

#End Region

#Region "Debug"

        ''' <summary>
        ''' デバッグログにメッセージを出力する。
        ''' </summary>
        ''' <param name="message">ログメッセージ</param>
        Public Shared Sub DebugLog(ByVal message As String)
            If (IsDebugEnabled()) Then _
                My.Application.Log.WriteEntry(message)
        End Sub

        ''' <summary>
        ''' デバッグログに例外を出力する。
        ''' </summary>
        ''' <param name="ex">例外</param>
        Public Shared Sub DebugLog(ByVal ex As Exception)
            If (IsDebugEnabled()) Then _
            My.Application.Log.WriteException(ex)
        End Sub

#End Region

#Region "Info"

        ''' <summary>
        ''' 情報ログにメッセージを出力する。
        ''' </summary>
        ''' <param name="message">ログメッセージ</param>
        Public Shared Sub InfoLog(ByVal message As String)
            If (IsInfoEnabled()) Then _
            Logger.Log(message, TraceEventType.Information)
        End Sub

        ''' <summary>
        ''' 情報ログに例外を出力する。
        ''' </summary>
        ''' <param name="ex">例外</param>
        Public Shared Sub InfoLog(ByVal ex As Exception)
            If (IsInfoEnabled()) Then _
            Logger.Log(ex, TraceEventType.Information)
        End Sub

        ''' <summary>
        ''' 情報ログにメッセージと例外を出力する。
        ''' </summary>
        ''' <param name="message">ログメッセージ</param>
        ''' <param name="ex">例外</param>
        Public Shared Sub InfoLog(ByVal message As String, ByVal ex As Exception)
            If (IsInfoEnabled()) Then _
            Logger.Log(message, ex, TraceEventType.Information)
        End Sub

#End Region

#Region "Warn"

        ''' <summary>
        ''' 警告ログにメッセージを出力する。
        ''' </summary>
        ''' <param name="message">ログメッセージ</param>
        Public Shared Sub WarnLog(ByVal message As String)
            If (IsWarnEnabled()) Then _
            Logger.Log(message, TraceEventType.Warning)
        End Sub

        ''' <summary>
        ''' 警告ログに例外を出力する。
        ''' </summary>
        ''' <param name="ex">例外</param>
        Public Shared Sub WarnLog(ByVal ex As Exception)
            If (IsWarnEnabled()) Then _
            Logger.Log(ex, TraceEventType.Warning)
        End Sub

        ''' <summary>
        ''' 警告ログにメッセージと例外を出力する。
        ''' </summary>
        ''' <param name="message">ログメッセージ</param>
        ''' <param name="ex">例外</param>
        Public Shared Sub WarnLog(ByVal message As String, ByVal ex As Exception)
            If (IsWarnEnabled()) Then _
            Logger.Log(message, ex, TraceEventType.Warning)
        End Sub

#End Region

#Region "Error"

        ''' <summary>
        ''' エラーログにメッセージを出力する。
        ''' </summary>
        ''' <param name="message">ログメッセージ</param>
        Public Shared Sub ErrorLog(ByVal message As String)
            If (IsErrorEnabled()) Then _
            Logger.Log(message, TraceEventType.Error)
        End Sub

        ''' <summary>
        ''' エラーログに例外を出力する。
        ''' </summary>
        ''' <param name="ex">例外</param>
        Public Shared Sub ErrorLog(ByVal ex As Exception)
            If (IsErrorEnabled()) Then _
            Logger.Log(ex, TraceEventType.Error)
        End Sub

        ''' <summary>
        ''' エラーログにメッセージと例外を出力する。
        ''' </summary>
        ''' <param name="message">ログメッセージ</param>
        ''' <param name="ex">例外</param>
        Public Shared Sub ErrorLog(ByVal message As String, ByVal ex As Exception)
            If (IsErrorEnabled()) Then _
            Logger.Log(message, ex, TraceEventType.Error)
        End Sub

#End Region

#Region "Fatal"

        ''' <summary>
        ''' 致命的エラーログにメッセージを出力する。
        ''' </summary>
        ''' <param name="message">ログメッセージ</param>
        Public Shared Sub FatalLog(ByVal message As String)
            If (IsFatalEnabled()) Then _
            Logger.Log(message, TraceEventType.Critical)
        End Sub

        ''' <summary>
        ''' 致命的エラーログに例外を出力する。
        ''' </summary>
        ''' <param name="ex">例外</param>
        Public Shared Sub FatalLog(ByVal ex As Exception)
            If (IsFatalEnabled()) Then _
            Logger.Log(ex, TraceEventType.Critical)
        End Sub

        ''' <summary>
        ''' 致命的エラーログにメッセージと例外を出力する。
        ''' </summary>
        ''' <param name="message">ログメッセージ</param>
        ''' <param name="ex">例外</param>
        Public Shared Sub FatalLog(ByVal message As String, ByVal ex As Exception)
            If (IsFatalEnabled()) Then _
            Logger.Log(message, ex, TraceEventType.Critical)
        End Sub

#End Region

#Region "ログ出力レベル取得メソッド"

        Public Shared Function IsDebugEnabled() As Boolean
            Return (Level <= LogLevel.DEBUG)
        End Function

        Public Shared Function IsInfoEnabled() As Boolean
            Return (Level <= LogLevel.INFO)
        End Function

        Public Shared Function IsWarnEnabled() As Boolean
            Return (Level <= LogLevel.WARN)
        End Function

        Public Shared Function IsErrorEnabled() As Boolean
            Return (Level <= LogLevel.ERR)
        End Function

        Public Shared Function IsFatalEnabled() As Boolean
            Return (Level <= LogLevel.FATAL)
        End Function

#End Region

    End Class

End Namespace
